perm filename LS0.SAI[SAI,BGB] blob
sn#107850 filedate 1974-06-20 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "TEST7"
C00004 00003 REAL SUBR DSKEW (ITG E1,E2) α DISTANCE BETWEEN SKEW LINES
C00006 00004 REAL SUBR CAMCOS (ITG V1,V2,C) α CAMERA RAY COSINES
C00009 00005 SUBR MKCAMRS α MAKE AND POSITION TWO CAMERAS
C00010 00006 RAYCOS[1,1]←CAMCOS(V1,V2,F1)
C00012 00007 SUBR RECOORD α CHANGE COORDINATE FRAME OF REFERENCE
C00015 00008 SUBR MKFORKS(REAL OM1,OM2)
C00022 00009 SUBR SETFORKS (REAL W1,W2,W3) α SET CAMERA FORKS TO GIVEN POSITION
C00023 00010 α MAIN EXECUTION
C00026 ENDMK
C⊗;
BEGIN "TEST7"
REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
REQUIRE "GEOMES.HDR[GEM,HE]" SOURCE_FILE;
EXTERNAL SAFE ITG ARRAY DPYBUF[0:1];
α GLOBAL DECLARATIONS;
ITG FORK1,FORK2;
REAL α1,α2;
ITG U1,U2,U3,U4,U5,TET;
ITG CIRCLE1,CIRCLE2;
ITG E,V1,V2,V3,V4,V5; α VERTICES OF TETRAHEDRON;
ITG C1,C2,WRLD; α CAMERAS & WORLD;
ITG I,F1,F2; α CAMERA FRAMES;
REAL RR1,SS1,RR2,SS2; α CIRCLE SIZES;
REAL ARRAY RAYCOS[1:10,1:2]; α FORK RAYS;
ITG EV3,EV4,EV5,EU3,EU4,EU5; α CAMERA RAYSL;
REAL WW1,WW2,WW3
REAL D3,D4,D5;
REAL C1X,C1Y,C1Z;
REAL C2X,C2Y,C2Z;
REAL SUBR DSKEW (ITG E1,E2); α DISTANCE BETWEEN SKEW LINES;
BEGIN "DSKEW"
ITG V1,V2,U1,U2;
REAL A1,B1,C1,A2,B2,C2,D;
REAL C11,C12,C13,C21,C22,C23;
REAL P,Q,R;
V1←NVT(E1); V2←PVT(E1); U1←NVT(E2); U2←PVT(E2);
A1 ← XWC(V2) - XWC(V1); B1 ← YWC(V2) - YWC(V1); C1 ← ZWC(V2) - ZWC(V1);
A2 ← XWC(U2) - XWC(U1); B2 ← YWC(U2) - YWC(U1); C2 ← ZWC(U2) - ZWC(U1);
C11 ← A1*A1 + B1*B1 + C1*C1;
C22 ← A2*A2 + B2*B2 + C2*C2;
C12 ←-A1*A2 - B1*B2 - C1*C2;
C21 ← C12;
C13 ← A1*(XWC(V1)-XWC(U1))+B1*(YWC(V1)-YWC(U1))+C1*(ZWC(V1)-ZWC(U1));
C23 ← A2*(XWC(U1)-XWC(V1))+B2*(YWC(U1)-YWC(V1))+C2*(ZWC(U1)-ZWC(V1));
R ← C11*C22 - C12*C21;
IF ABS(R) ≤ 0.0001 THEN ⊂ P←C13/C11; Q←0; ⊃ ELSE
⊂ P ←(C13*C22 - C12*C23)/R;Q ←(C11*C23 - C13*C21)/R;⊃;
P←-P;Q←-Q;
RETURN(SQRT(
((XWC(U1)+Q*A2) - (XWC(V1)+P*A1))↑2 +
((YWC(U1)+Q*B2) - (YWC(V1)+P*B1))↑2 +
((ZWC(U1)+Q*C2) - (ZWC(V1)+P*C1))↑2 ));
END "DSKEW";
REAL SUBR CAMCOS (ITG V1,V2,C); α CAMERA RAY COSINES;
BEGIN "CAMCOS"
REAL X1,Y1,Z1,X2,Y2,Z2,R1,R2;
X1 ← XWC(V1) - XWC(C); X2 ← XWC(V2) - XWC(C);
Y2 ← YWC(V2) - YWC(C); Y1 ← YWC(V1) - YWC(C);
Z1 ← ZWC(V1) - ZWC(C); Z2 ← ZWC(V2) - ZWC(C);
R1 ← SQRT(X1*X1 + Y1*Y1 + Z1*Z1); R2 ← SQRT(X2*X2 + Y2*Y2 + Z2*Z2);
RETURN((X1*X2+Y1*Y2+Z1*Z2)/(R1*R2));
END "CAMCOS";
SUBR TRIAD (ITG V,I,J);
BEGIN "TRIAD"
REAL Cα,Sα,Cβ,CG,X,Y,Z;
Cα ← RAYCOS[1,J]; Sα ← SQRT(1-Cα*Cα);
Cβ ← RAYCOS[2+I,J];
CG ← RAYCOS[4+I,J];
X ← Cβ; Y ← (CG-Cα*Cβ)/Sα; Z ← SQRT(1-X*X-Y*Y);
XWC(V)←X*10; YWC(V)←Y*10; ZWC(V)←Z*10;
END "TRIAD";
SUBR MKCAMRS; α MAKE AND POSITION TWO CAMERAS;
BEGIN "MKCAMRS"
ITG B1;
PTOSTR(0,"βCβ}W↑Qα/α)\\**//εE");GEOMED; α MAKE TWO CAMERAS;
TET←INB3D("TETT");GEODPY; α TEST TETRAHEDRON;
WRLD ← DAD(UNIVERSE); α WORLD NODE;
C1 ← DAD(WRLD); F1 ← ALT2(C1); α CAMERA & FRAME ONE;
C2 ← SON(WRLD); F2 ← ALT2(C2); α CAMERA & FRAME TWO;
V1←PVT(TET);V2←PVT(V1); α VERTICES OF THE TETRAHEDRON;
V3←PVT(V2);V4←PVT(V3);V5←PVT(V4);
RAYCOS[1,1]←CAMCOS(V1,V2,F1);
RAYCOS[2,1]←CAMCOS(V1,V3,F1);
RAYCOS[3,1]←CAMCOS(V1,V4,F1);
RAYCOS[4,1]←CAMCOS(V1,V5,F1);
RAYCOS[5,1]←CAMCOS(V2,V3,F1);
RAYCOS[6,1]←CAMCOS(V2,V4,F1);
RAYCOS[7,1]←CAMCOS(V2,V5,F1);
RAYCOS[8,1]←CAMCOS(V3,V4,F1);
RAYCOS[9,1]←CAMCOS(V3,V5,F1);
RAYCOS[10,1]←CAMCOS(V4,V5,F1);
RAYCOS[1,2]←CAMCOS(V1,V2,F2);
RAYCOS[2,2]←CAMCOS(V1,V3,F2);
RAYCOS[3,2]←CAMCOS(V1,V4,F2);
RAYCOS[4,2]←CAMCOS(V1,V5,F2);
RAYCOS[5,2]←CAMCOS(V2,V3,F2);
RAYCOS[6,2]←CAMCOS(V2,V4,F2);
RAYCOS[7,2]←CAMCOS(V2,V5,F2);
RAYCOS[8,2]←CAMCOS(V3,V4,F2);
RAYCOS[9,2]←CAMCOS(V3,V5,F2);
RAYCOS[10,2]←CAMCOS(V4,V5,F2);
FOR I←1 THRU 10 DO
OUTSTR(CVG(RAYCOS[I,1])&CVG(RAYCOS[I,2])&↓);
INCHRW;
α MAKE P1-P2 AXIS;
B1 ← MKBFV; F1←PFACE(B1);
V1 ← PVT(B1); YWC(V1) ← +1;
V1 ← MKEV(F1,V1); YWC(V1) ← -1;
α MAKE CIRCLES OF POTENTIAL CAMERA LOCI;
α1 ← ACOS(RAYCOS[1,1]); α2 ← ACOS(RAYCOS[1,2]);
RR1 ← 1/SIN(α1); RR2 ← 1/SIN(α2);
SS1 ← RR1*RAYCOS[1,1]; SS2 ← RR2*RAYCOS[1,2];
CIRCLE1 ← MKCYLN(RR1,17,0);TRANSL(CIRCLE1,SS1,0,0);
CIRCLE2 ← MKCYLN(RR2,17,0);TRANSL(CIRCLE2,SS2,0,0);
OUTSTR("α1 = "&CVG(α1*180/π)&"α2 = "&CVG(α2*180/π)&↓);
END "MKCAMRS";
SUBR RECOORD; α CHANGE COORDINATE FRAME OF REFERENCE;
BEGIN "RECOORD"
REAL FACTOR,ARC,ORGX,ORGY,ORGZ;
ITG WRLD,F1,F2,V1,V2,V3,V4;
WRLD ← DAD(UNIVERSE); α WORLD NODE;
F1←ALT2(DAD(WRLD));F2←ALT2(SON(WRLD)); α CAMER FRAMES;
V1←PVT(TET);V2←PVT(V1); α VERTICES OF THE TETRAHEDRON;
V3←PVT(V2);V4←PVT(V3);
α SCALE;
FACTOR ← 2/DISTAN(V1,V2);
SHRINK(TET,FACTOR,FACTOR,FACTOR);
SHRINK(F1,FACTOR,FACTOR,FACTOR);
SHRINK(F2,FACTOR,FACTOR,FACTOR);
α TRANSLATE;
ORGX ← -0.5*(XWC(V1) + XWC(V2));
ORGY ← -0.5*(YWC(V1) + YWC(V2));
ORGZ ← -0.5*(ZWC(V1) + ZWC(V2));
TRANSL(TET,ORGX,ORGY,ORGZ);
TRANSL(F1,ORGX,ORGY,ORGZ);
TRANSL(F2,ORGX,ORGY,ORGZ);
α ROTATE;
ARC ← ATAN2(ZWC(V1),XWC(V1));
ROTATE(TET,0,ARC,0);ROTATE(F1,0,ARC,0);ROTATE(F2,0,ARC,0);
ARC ← ATAN2(XWC(V1),YWC(V1));
ROTATE(TET,0,0,ARC);ROTATE(F1,0,0,ARC);ROTATE(F2,0,0,ARC);
ARC ← ATAN2(ZWC(F1),XWC(F1));
ROTATE(TET,0,ARC,0);ROTATE(F1,0,ARC,0);ROTATE(F2,0,ARC,0);
α SOLUTION CAMERA POSITIONS;
XWC(V1)←ZWC(V1)←XWC(V2)←ZWC(V2)←ZWC(F1)←0;
C1X ← XWC(F1); C1Y ← YWC(F1); C1Z ← ZWC(F1);
C2X ← XWC(F2); C2Y ← YWC(F2); C2Z ← ZWC(F2);
OUTSTR("CAMERA LOCUS 1: "&CVG(C1X)&CVG(C1Y)&CVG(C1Z)&↓);
OUTSTR("CAMERA LOCUS 2: "&CVG(C2X)&CVG(C2Y)&CVG(C2Z)&↓);
END "RECOORD";
SUBR MKFORKS(REAL OM1,OM2);
BEGIN "MKFORKS"
α MAKE CAMERA RAY FORK1 IN ITS INITIAL POSITION;
FORK2 ← MKBFV; F1←PFACE(FORK2);
V3 ← PVT(FORK2);V1 ← MKEV(F1,V3);V4 ← MKEV(F1,V1);
XWC(V3)←6; XWC(V4)←6*COS(α1);YWC(V4)←6*SIN(α1);U3←V3;U4←V4;U1←V1;
FORK1 ← MKBFV; F1←PFACE(FORK1);BATT(FORK2,FORK1);
V3 ← PVT(FORK1);V1 ← MKEV(F1,V3);V4 ← MKEV(F1,V1);
TRIAD(V3,0,1); ZWC(V3)←-ZWC(V3);TRIAD(V4,1,1);
ROTATE(FORK1,0,0,-OM1);
XWC(V3)←XWC(V3)-RR1;XWC(V1)←XWC(V1)-RR1;XWC(V4)←XWC(V4)-RR1;
XWC(U3)←XWC(U3)-RR1;XWC(U1)←XWC(U1)-RR1;XWC(U4)←XWC(U4)-RR1;
TRANSL(FORK1,SS1,0,0);
ROTATE(-FORK1,0,0,π);
EV3←PED(V3);EV4←PED(V4);
IF NVT(EV3)=V3 THEN INVERT(EV3);IF NVT(EV4)=V4 THEN INVERT(EV4);
α CAMERA CAMERA RAY FORK2 IN ITS INITIAL POSITION;
FORK2 ← MKBFV; F1←PFACE(FORK2);
U3 ← PVT(FORK2);U1 ← MKEV(F1,U3);U4 ← MKEV(F1,U1);
TRIAD(U3,0,2);ZWC(U3)←-ZWC(U3);TRIAD(U4,1,2);
ROTATE(FORK2,0,0,-OM2);
XWC(U3)←XWC(U3)-RR2;XWC(U1)←XWC(U1)-RR2;XWC(U4)←XWC(U4)-RR2;
TRANSL(FORK2,SS2,0,0);
ROTATE(-FORK2,0,0,π);
EU3←PED(U3);EU4←PED(U4);
IF NVT(EU3)=U3 THEN INVERT(EU3);IF NVT(EU4)=U4 THEN INVERT(EU4);
END "MKFORKS";
SUBR SETFORKS (REAL W1,W2,W3); α SET CAMERA FORKS TO GIVEN POSITION;
BEGIN "SETFORKS"
REAL OM1,OM2;
OM1 ← ATAN2(1-RR1*SIN(W1),SS1+RR1*COS(W1)) + W1;
OM2 ← ATAN2(1-RR2*SIN(W2),SS2+RR2*COS(W2)) + W2;
OUTSTR("OM1 = "&CVG(OM1*180/π)&"OM2 = "&CVG(OM2*180/π)&↓);
IF FORK1≠0 THEN KLBFEV(FORK1);
IF FORK2≠0 THEN KLBFEV(FORK2);
MKFORKS(OM1,OM2);
ROTATE(-FORK1,0,0,W1);
ROTATE(-FORK2,0,0,W2);
ROTATE( FORK2,0,W3,0);
END "SETFORKS";
α MAIN EXECUTION;
MKCAMRS;
RECOORD;
WW1 ← ATAN2(C1Y,C1X-SS1);
WW2 ← ASIN (C2Y/RR2);
WW3 ← ATAN2(-C2Z,C2X);
SETFORKS(WW1,WW2,WW3);
D3 ← DSKEW(EV3,EU3);
D4 ← DSKEW(EV4,EU4);
OUTSTR(↓&"ERRORS: "&CVG(D3)&9&CVG(D4)&9&CVG(1/(1+D3+D4))&↓);
GEOMED;
END "TEST7";